import QtQuick 1.0
import "Components"
import "WebAccess/TwitterAPI.js" as TwitterAPI
import "Util/Util.js" as Util
import "Util/IncSearch.js" as IncSearch

Rectangle {
    x: 0
    y: 0
    width: parent.width
    height: _textTweet.height + _textTweet.anchors.topMargin + _textTweet.anchors.bottomMargin

    color: "#111111"

    property alias text: _textTweet.text        //入力されているテキストへのアクセス
    property string inReplyToId: ""             //replyの時の情報
    property string inReplyToScreenName: ""     //replyの対象のスクリーンネームこれがツイーとに含まれなければ削除


    //フォーカスを設定する
    function setFocusTextEdit(is){
        if(is){
            _textTweet.forceActiveFocus();
        }else{
            _textTweet.focus = false;
        }
    }
    // ボタンをフォーカスする
    function setFocusButton(is){
        if(is){
            _buttonTweet.forceActiveFocus();
        }else{
            _buttonTweet.focus = false;
        }
    }


    // リプライのスクリーンネームを挿入する
    function insertReplyScreenName(screen_name, status_id){
        if(screen_name.length === 0){
        }else if(_textTweet.text.indexOf("@" + screen_name) >= 0){
            //既にある
        }else{
            _textTweet.text = "@" + screen_name + " " + _textTweet.text;
            inReplyToId = status_id;
        }
        // カーソルを移動
        _textTweet.moveCursorEnd();
        // フォーカスをセットする
        setFocusTextEdit(true);
    }

    // リプライのスクリーンネームを挿入する（テキストに含まれるのも含む）
    function insertReplyScreenNameWithinText(screen_name, status_id, text){
        var screen_names = Util.pickUpScreenNames(text);
        var my_name = TwitterAPI.getAuthUserName().toLowerCase();

        if(screen_names === null){
        }else{
            for(var i=0; i<screen_names.length; i++){
                if(my_name.indexOf(screen_names[i].toLowerCase()) >= 0){
                    // 自分は除く
                }else{
                    insertReplyScreenName(screen_names[i], status_id);
                }
            }
        }
        insertReplyScreenName(screen_name, status_id);

        // カーソルを移動
        _textTweet.moveCursorEnd();
        // フォーカスをセットする
        setFocusTextEdit(true);
    }

    // QTでメッセージを再設定する
    function setQT(screen_name, status_id, text){
        if(screen_name.length === 0){
        }else{
            _textTweet.text = " QT @"
                                + screen_name
                                + ": "
                                + text;
            inReplyToId = status_id;

            // カーソルを移動
            _textTweet.moveCursorStart();
            // フォーカスをセットする
            setFocusTextEdit(true);
        }
    }

    // DMようにメッセージを再設定する
    function setDM(screen_name){
        if(screen_name.length === 0){
        }else{
            _textTweet.text = "D " + screen_name + " ";

            // カーソルを移動
            _textTweet.moveCursorEnd();
            // フォーカスをセットする
            setFocusTextEdit(true);
        }
    }


    // ついーとの入力ボックス
    TextBox {
        id: _textTweet
        anchors.left: parent.left
        anchors.top: parent.top
        anchors.right: _textRemainCount.left

        anchors.leftMargin: 5
        anchors.topMargin: 5
        anchors.rightMargin: 5
        anchors.bottomMargin: 5

        property string incSearchSymbol: ""     // サーチのきっかけの記号
        property string incSearchKind: ""       // サーチの種類

        onTextChanged: {
            if(text.length > 0){
                _rootContainer.openTweetContainer(true);
            }

            // 文字列の長さを計算（入力残数）
            _textRemainCount.text = 140 - text.length;

            // 検索の処理
            if(_menuContainer.isIncSearch() && incSearchKind.length > 0){
                // インクリメンタルサーチ中
                var cursor_pos = textCursorPosition;
                var at_pos = text.lastIndexOf(incSearchSymbol, cursor_pos);
                var sp_pos = text.lastIndexOf(" ", cursor_pos - 1); // 入力はじめでスペースの前に@入れるとスペースが見つかってしまうから
//                Util.outputDebugString("at=" + at_pos + ", sp=" + sp_pos + ", cur=" + cursor_pos);
                if((at_pos < 0) || (at_pos < sp_pos)){
                    // なくなった or スペースよりも前
                    _menuContainer.close(false);
                }else{
                    var names = IncSearch.getDatas(incSearchKind
                                          , text.substring(at_pos + 1, cursor_pos));
//                    Util.outputDebugString("names.length=" + ((names === null) ? -1 : names.length)
//                                           + ",at_pos=" + at_pos
//                                           + ",cursor_pos=" + cursor_pos
//                                           + ",name=" + text.substring(at_pos + 1, cursor_pos));
//                    for(var i=0; i<names.length; i++){
//                            Util.outputDebugString(" name[" + i + "]=" + names[i]);
//                    }

                    // リストを更新
                    _menuContainer.updateIncSearchList(names);
                }
            }

        }

        onTabPressed: {
            // フォーカス移動
            _rootContainer.setNextFocus(1, true);
        }
        onBacktabPressed: {
            // フォーカス移動
            _rootContainer.setNextFocus(1, false);
        }
        onEnterPressed: {
            if(event.modifiers & Qt.ControlModifier){
                // 送信
                sendTweet();

            }else if(_menuContainer.isIncSearch() && incSearchKind.length > 0){
                // 検索中
                var index = _menuContainer.getIncSearchResultIndex();
                var prev = incSearchSymbol + IncSearch.getLastSearchValue(incSearchKind);
                var next = incSearchSymbol + IncSearch.getInSelectedList(incSearchKind, index);

                Util.outputDebugString("result index=" + index
                                       + ", result=" + next
                                       + ", value=" + prev);

                // 検索結果で置き換え
                text = text.replace(prev, next);

                // カーソル位置を変更
                var pos = text.indexOf(next);
                textCursorPosition = pos + next.length;

                // 閉じる
                _menuContainer.close(false);
            }else{

            }
        }
        onEscapePressed: {
            // 閉じる
            if(_menuContainer.isIncSearch()){
                // サーチを閉じる
                _menuContainer.close(false);
                incSearchKind = "";
            }else{
                // ツイートエリアを閉じる
                _rootContainer.openTweetContainer(false);
            }
        }

        onPressed: {
            Util.outputDebugString("key=" + event.key);
            switch(event.key){
            case Qt.Key_F5:
                // 更新
                _contentContainer.update();
                break;
            case Qt.Key_At:
                // ユーザーID検索開始
                if(_menuContainer.isIncSearch()){
                }else{
                    incSearchKind = IncSearch.SEARCH_KIND_SCREEN_NAME;
                    incSearchSymbol = IncSearch.getSearchSymbol(incSearchKind);
                    _menuContainer.open("MenuContextIncSearch");
                }
                break;
            case Qt.Key_NumberSign:
                // ハッシュタグ検索開始
                if(_menuContainer.isIncSearch()){
                }else{
                    incSearchKind = IncSearch.SEARCH_KIND_HASH_TAG;
                    incSearchSymbol = IncSearch.getSearchSymbol(incSearchKind);
                    _menuContainer.open("MenuContextIncSearch");
                }
                break;

            case Qt.Key_Space:
                // スペース

                // サーチ中なら消す
                if(_menuContainer.isIncSearch()){
                    _menuContainer.close(false);
                    incSearchKind = "";
                }
                break;

            case Qt.Key_Up:
                // サーチ中なら動かす
                if(_menuContainer.isIncSearch()){
                    _menuContainer.moveIncSearchIndex(true);
                }
                break;

            case Qt.Key_Down:
                // サーチ中なら動かす
                if(_menuContainer.isIncSearch()){
                    _menuContainer.moveIncSearchIndex(false);
                }
                break;

            default:
                break;
            }

            var xxxxx=0;    // switchを正常動作させるためのダミーコード
        }
    }

    // 残文字数表示
    Text {
        id: _textRemainCount
        width: 25
        height: _textTweet.height

        anchors.top: parent.top
        anchors.right: _buttonTweet.left
        anchors.leftMargin: 5
        anchors.topMargin: 5
        anchors.rightMargin: 5
        anchors.bottomMargin: 5

        verticalAlignment: Text.AlignVCenter
        horizontalAlignment: Text.AlignHCenter

        style: Text.Outline
        styleColor: "#333333"

        color: "#ffffff"
        text: "140"
    }


    // ツイートボタン
    Button {
        id: _buttonTweet
        anchors.top: parent.top
        anchors.right: parent.right
        anchors.topMargin: 5
        anchors.rightMargin: 5
        width: 50
        height: _textTweet.height

        text: "Tweet"

        onClicked: {
            sendTweet();
        }
        Keys.onEnterPressed: {
            sendTweet();
        }
        Keys.onReturnPressed: {
            sendTweet();
        }
        Keys.onTabPressed: {
            // フォーカス移動
            _rootContainer.setNextFocus(2, true);
        }
        Keys.onBacktabPressed: {
            // フォーカス移動
            _rootContainer.setNextFocus(2, false);
        }
        Keys.onEscapePressed: {
            // 閉じる
            _rootContainer.openTweetContainer(false);
        }
        Keys.onPressed: {
            switch(event.key){
            case Qt.Key_F5:
                // 更新
                _contentContainer.update();
                break;
            default:
                break;
            }
        }
    }

    //つぶやく
    function sendTweet(){
        var len = _textTweet.text.length;
        if(len < 1){
            //トースト表示
            _toast.show("Please input tweet.")
        }else{
            //in reply to が指定されてるのにツイート内容にIDがなければIDは削除
            if(inReplyToId.length > 0){
                if(_textTweet.text.indexOf(inReplyToScreenName) >= 0){
                    //含まれる
                }else{
                    inReplyToId = "";
                }
            }
            //つぶやく
            var obj = new TwitterAPI.sendTweet(_textTweet.text, inReplyToId, onTweetResponse);
            _textTweet.text = "";
        }
    }

    //つぶやきのレスポンス
    function onTweetResponse(object){
        console.debug("onTweetResponse")
//        _textTweet.text = "";
        //        _textTweet.forceActiveFocus();

        //トースト表示
        _toast.show("Sent")
    }
}
